﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BLLMagiPack.Managers;
using ModeloMagiPack.Entidades;
using DALMagiPack.Funcionalidad;

namespace BLLMagiPack.Managers
{
    public class BLLModeloCaja : BLLMagiPack
    {
        public ModeloCaja TraerModeloCaja(int? idModeloCaja)
        {
            DALMagiPack<ModeloCaja> dalModeloCaja = new DALMagiPack<ModeloCaja>();
            List<Filtro> opciones = new List<Filtro>() { new Filtro() { Columna = NombresColumnas.IdModeloCaja, Tipo = TipoFiltro.Equal } };

            return dalModeloCaja.Traer(new ModeloCaja() { IdModeloCaja = idModeloCaja }, opciones).FirstOrDefault();
        }

        public List<ModeloCaja> TraerModeloCajas(string codigo, bool exacto)
        {
            DALMagiPack<ModeloCaja> dalModeloCaja = new DALMagiPack<ModeloCaja>();
            List<Filtro> opciones = new List<Filtro>() { new Filtro() { Columna = NombresColumnas.Codigo, Tipo = (exacto)? TipoFiltro.Equal : TipoFiltro.Like } };

            return dalModeloCaja.Traer(new ModeloCaja() { Codigo = codigo }, opciones);
        }

        public List<ModeloCaja> TraerModeloCajas(int idCliente)
        {
            DALMagiPack<ModeloCaja> dalModeloCaja = new DALMagiPack<ModeloCaja>();
            List<Filtro> opciones = new List<Filtro>() { new Filtro() { Columna = NombresColumnas.IdCliente, Tipo = TipoFiltro.Equal } };

            return dalModeloCaja.Traer(new ModeloCaja() { IdCliente = idCliente }, opciones);
        }

        public List<ModeloCaja> TraerModeloCajas()
        {
            DALMagiPack<ModeloCaja> dal = new DALMagiPack<ModeloCaja>();

            return dal.Traer(new ModeloCaja(), new List<Filtro>());
        }

        public void CrearModeloCaja(ModeloCaja nuevaModeloCaja)
        {
            DALMagiPack<ModeloCaja> dalModeloCaja = new DALMagiPack<ModeloCaja>();

            if (TraerModeloCajas(nuevaModeloCaja.Codigo, true).Count > 0)
                throw new BLLMagiPackException("Ya existe un modelo con el código " + nuevaModeloCaja.Codigo);

            dalModeloCaja.Insertar(nuevaModeloCaja);
        }

        public void ModificarModeloCaja(ModeloCaja modeloCaja)
        {
            DALMagiPack<ModeloCaja> dalModeloCaja = new DALMagiPack<ModeloCaja>();
            ModeloCaja modeloCajaViejo = TraerModeloCaja(modeloCaja.IdModeloCaja);

            if(!modeloCajaViejo.Codigo.Equals(modeloCaja.Codigo) && TraerModeloCajas(modeloCaja.Codigo, true).Count > 0)
                throw new BLLMagiPackException("Ya existe un modelo con el código " + modeloCaja.Codigo);

            dalModeloCaja.Modificar(modeloCaja);
        }

        public void EliminarModeloCaja(ModeloCaja modeloCaja)
        {
            DALMagiPack<ModeloCaja> dalModeloCaja = new DALMagiPack<ModeloCaja>();

            if (new BLLOrden().TraerOrdenesPorModelo(modeloCaja.IdModeloCaja).Count > 0)
                throw new Exception("No se puede eliminar porque hay órdenes asignadas a este modelo de caja");

            dalModeloCaja.Eliminar(modeloCaja);
        }
    }
}
